home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / va45 / visual45 / library / extend / file.s < prev    next >
Text File  |  1998-05-23  |  6KB  |  244 lines

  1.     ifd LIB_FIND_TEXT_IN_FILE
  2.  
  3. ;------------------------------------------------------------------------------
  4. ; Method name : -
  5. ; Asm label   : GWVA_FILE_RETURN_TEXT_IN_FILE
  6. ; Description : Recherche d'une chaine de caractère dans un ficher et recopie
  7. ; Description : de la ligne dans un buffer
  8. ;
  9. ; Rq  : Les lignes du fichier doivent impérativement se terminer par #rc
  10. ; in  : a0.l = pointeur sur la chaine du nom de fichier
  11. ; in  : a1.l = chaine de caractère à rechercher
  12. ; in  : a2.l = pointeur sur un buffer où stocker résultat + calcul intermédiaire
  13. ; in  : d0.l = taille du buffer pointer par a2
  14. ; out : d7.w = GWVA_NO_ERROR_GENERIC si pas d'erreur, GWVA_ERROR_GENERIC sinon
  15. ; out : (a2) = copie de la chaine de caractères cherchée jusqu'au #rc, remplacé
  16. ;       par un 0.b
  17. ;
  18. ; 16/05/98 : Création
  19. ;------------------------------------------------------------------------------
  20. GWVA_FILE_RETURN_TEXT_IN_FILE:
  21.  
  22.     move.l d0,d5    ; d5 = taille buffer tout du long
  23.  
  24.     save.l d0/d5/a1/a2
  25.     FILE_OPEN read,(a0),d7
  26.     load.l d0/d5/a1/a2
  27.     tst d7
  28.     bmi .error
  29.  
  30.     clr.l d1        ; buff temp
  31.     clr.l d2        ; string to comp
  32.     move.l d0,d3
  33.  
  34.     ; a1 = ptr sur début string à comparer tout du long
  35.     ; a2 = ptr sur début buffer tout du long
  36.  
  37. .load_some_more:
  38.     save.l d1-d3/d5/a1-a2
  39.     move.l a2,a0
  40.     add.l d1,a0
  41.     FREAD a0,d3,d7
  42.     load.l d1-d3/d5/a1-a2
  43.     tst.l d0
  44.     beq .error2
  45.     add.l d1,d0
  46.     add.l d1,d3
  47.  
  48. .compare_more:
  49.     move.b (a2,d1.l),d6    ; dans buffer
  50.     cmp.b (a1,d2.l),d6    : == string ??
  51.     bne.s .badcomp
  52.  
  53.     addq.l #1,d2    ; bonne comparaison
  54.     tst.b (a1,d2.l)
  55.     bne.s .for_both    ; pas rendu à la fin de la comparaison
  56.  
  57.  
  58.     move.l a1,a3    ; on recopie le tout en tête de buffer
  59.     move.l a2,a4
  60.     move.l d2,d4    ; d2=long chaine de comparaison à recopier donc
  61.     subq #1,d4
  62. .cp:    move.b (a3)+,(a4)+
  63.     dbf d4,.cp
  64.  
  65. .copy_ok:    addq.l #1,d1    ; recopie ce qui suivait la string dans buffer
  66.     cmp.l d1,d0
  67.     beq.s .reload_encore
  68.  
  69.     move.b (a2,d1.l),d4
  70.     cmp.b #rc,d4
  71.     beq.s .finito
  72.     move.b d4,(a4)+
  73.     bra.s .copy_ok
  74.  
  75. .reload_encore:
  76.     move.l a2,d0
  77.     add.l d5,d0
  78.     sub.l a4,d0
  79.     save.l a4
  80.     FREAD a4,d0,d7    ; on sauve rien de plus : c'est fini
  81.     load.l a4
  82. .sear:    cmp.b #rc,(a4)+    ; chaque ligne doit se terminer par rc
  83.     bne.s .sear
  84.     lea -1(a4),a4
  85.  
  86. .finito:    clr.b (a4)+
  87.     bra.s .fin_ok
  88.  
  89. .badcomp:    clr.l d2
  90. *    bra.s .compare_more    ; bug algorithmique : si recherche ABC
  91.             ; et on a : ABABC : trouve pas ...
  92.     ; ici ca va car on a toujours le champs d'avant qui est spécial
  93.  
  94. .for_both:    addq.l #1,d1
  95.  
  96.     cmp.l d1,d0
  97.     bne.s .compare_more
  98.  
  99.  
  100.     tst.l d2
  101.     beq.s .pas_coupe
  102.  
  103.     move.l a1,a3        ; coupé
  104.     move.l a2,a4
  105.     move.l d2,d4
  106.     subq #1,d4
  107. .cp2:    move.b (a3)+,(a4)+
  108.     dbf d4,.cp2
  109.  
  110.     move.l d2,d1    ; buff temp
  111.     move.l d5,d3
  112.     sub.l d1,d3        ; how many to load
  113.     bra .load_some_more
  114.  
  115. .pas_coupe:    cmp.l d3,d0
  116.     bne.s .error2
  117.  
  118.     clr.l d1        ; buff temp
  119.     *clr.l d2        ; string to comp
  120.     move.l d5,d3
  121.     bra .load_some_more
  122.  
  123. .fin_ok:    FCLOSE d7
  124.     move.w #GWVA_NO_ERROR_GENERIC,d7
  125.     rts
  126.  
  127. .error2:    FCLOSE d7
  128. .error:    move.w #GWVA_ERROR_GENERIC,d7
  129.     rts
  130.  
  131.     endc    ; ifd LIB_FIND_TEXT_IN_FILE
  132.  
  133.     ifd LIB_GET_FLENGTH
  134.  
  135. ;------------------------------------------------------------------------------
  136. ; Method name : -
  137. ; Asm label   : GWVA_FILE_RETURN_LENGTH
  138. ; Description : Renvoie la taille d'un fichier
  139. ;
  140. ; in  : a0.l = pointeur sur la chaine du nom de fichier
  141. ; out : d0.l = longueur du fichier ou <=0 si erreur
  142. ;
  143. ; 15/03/98 : Création
  144. ;------------------------------------------------------------------------------
  145. GWVA_FILE_RETURN_LENGTH:
  146.  
  147.     save.l a0
  148.     FGETDTA
  149.  
  150.     save.l d0        ; d0.l = adresse ancien DTA
  151.     FSETDTA GWVA_ROOT_DTA
  152.     load.l d0
  153.     load.l a0        ; a0.l = ptr sur le nom du fichier
  154.  
  155.     save.l d0
  156.     FSFIRST #FA_ARCHIVE|FA_HIDDEN|FA_READONLY,(a0)
  157.     load.l a0        ; a0.l = adresse ancien DTA
  158.  
  159.     save.w d0        ; d0.w code d'erreur de FSFIRST
  160.     FSETDTA (a0)
  161.     load.w d0
  162.     ext.l d0
  163.     bmi.s .erreur
  164.     move.l GWVA_ROOT_DTA+d_lenght,d0
  165. .erreur:    rts
  166.  
  167.     endc    ; ifd LIB_GET_FLENGTH
  168.  
  169.  
  170.     ifd LIB_LOAD_FILE_IN_MEM
  171.  
  172.  ifnd LIB_GET_FLENGTH
  173.   fail    ; LIB_LOAD_FILE_IN_MEM a besoin de la librairie LIB_GET_FLENGTH
  174.   end
  175.  endc
  176.  
  177. ;------------------------------------------------------------------------------
  178. ; Method name : -
  179. ; Asm label   : GWVA_FILE_LOAD_IN_MEM
  180. ; Description : Charge un fichier en allouant la mémoire par MXALLOC
  181. ;
  182. ; Rq  : Nécessite la librairie LIB_GET_FLENGTH
  183. ; in  : a0.l = pointeur sur la chaine du nom de fichier
  184. ; in  : d0.w = mode d'allocation de la mémoire (voir mxalloc) - constantes définies
  185. ; out : a0.l = pointeur sur le fichier chargé
  186. ; out : d0.l = longueur du fichier ou <=0 si erreur
  187. ;
  188. ; 15/03/98 : Création
  189. ;------------------------------------------------------------------------------
  190. GWVA_FILE_LOAD_IN_MEM:
  191.  
  192.     save.l d0/a0
  193.     bsr GWVA_FILE_RETURN_LENGTH
  194.     load.l d1/a0    ; d1.w = mode allocation MXALLOC
  195.     tst.l d0
  196.     ble.s .error_name_file
  197.  
  198.     save.l d0/a0    ; d0.l = longueur du fichier
  199.     MXALLOC d1,d0
  200.     load.l d1/a0    ; d1.l = longeur, a0.l = ptr nom
  201.  
  202.     tst.l d0        ; d0.l = pointeur la zone malloc
  203.     beq.s .error_allocation_mem
  204.  
  205.     save.l d0/d1    ; d0.l = ptr buffer, d1.l = longeur
  206.     FILE_OPEN read,(a0),d7
  207.     load.l d0/d1
  208.     tst d7
  209.     bmi.s .error_open_file
  210.     save.l d0/d1
  211.     FREAD d0,d1,d7
  212.     save.l d0
  213.     FCLOSE d7
  214.     load.l d2        ; d2.l = longueur du fichier chargé
  215.     load.l d0/d1
  216.  
  217.     cmp.l d2,d1
  218.     bne.s .error_read_file
  219.     move.l d0,a0    ; a0.l = ptr buffer
  220.     move.l d1,d0    ; longueur
  221. .error_name_file:
  222.     rts
  223.  
  224. .error_allocation_mem:
  225.     move.l #GWVA_ERROR_MALLOC,d0
  226.     rts
  227. .error_open_file:
  228.     save.w d7
  229.     MFREE d0
  230.     load.w d7
  231.     move.w d7,d0
  232.     ext.l d0
  233.     rts
  234.  
  235. .error_read_file:
  236.     MFREE d0
  237.     move.l #GWVA_ERROR_READ,d0
  238.     rts
  239.  
  240.     endc    ; ifd LIB_LOAD_FILE_IN_MEM
  241.  
  242.